/*
This source code is provided by Muhammad Saqib MYCPLUS Online Community WEbsite.
You are free to modify and change this code as per your requirements.

Website: http://4-tech-support.com/
Email:   msaqib@4-tech-support.com



*/
#include<stdio.h>
#include<conio.h>
#include<process.h>
#include<dos.h>
#include<stdlib.h>
#include<iostream>
#include<graphics.h>
#include<math.h>
#include<string.h>

float* mem;
int X = 0, Y = 0;
int row = 17, col = 5;
char dummy;
char flag = 'd', flagp = '0';
char bflag = 'u', bflagp = 'u';
int mflag = 0;
char ch, ch1, ch2;
int sflag = 0;
int midx, midy;
# define UNCLICKED 0
# define CLICKED 1
# define PI 3.14159


char str1[] = { "Muhammad Saqib Roll# 014" };

void typeit(int x, int y, int spacing, char string[])
{
	char temp[2];
	for (int i = 0; i < strlen(string); i++)
	{
		delay(100);
		temp[0] = string[i];
		temp[1] = '\0';
		outtextxy(x + (i + 1) * spacing, y, temp);
	}//endfor

}
void front()
{
	int x, y, h;
	for (x = 0; x <= 100; x++)
	{
		settextjustify(CENTER_TEXT, CENTER_TEXT);
		setcolor(1);
		settextstyle(1, 0, 4);
		setusercharsize(x, 6, x, 3);
		setcolor(14);
		moveto(310, 135);
		outtext("..");
		setcolor(6);
		moveto(310, 130);
		outtext("I I");
		if (x < 50)
			delay(30);
		else
			delay(20);
	}
	for (y = 0; y <= 100; y++)
	{
		setcolor(0);
		settextstyle(1, 0, 4);
		setusercharsize(y, 6, y, 3);
		moveto(310, 135);
		outtext("..");
		moveto(310, 130);
		outtext("I I");
		if (y > 20)
		{
			settextstyle(7, 0, 3);
			setusercharsize(y - 20, 35, y - 20, 30);
			setcolor(9);
			outtext("CALCULATER");
			setcolor(2);
			outtext("___________");
			delay(15);
			if (y < 100)
			{
				settextstyle(7, 0, 3);
				setusercharsize(y - 20, 35, y - 20, 30);
				setcolor(0);
				outtext("CALCULATER");
			}
		}
	}
	//delay(1000);
	settextstyle(3, 0, 2);
	delay(50);
	outtextxy(midx - 200, midy, "Group Members:-");
	//x=10,y=10;
	setcolor(6);
	settextstyle(4, 0, 4);
	typeit(midx - 200, midy + 50, 15, str1);
	getch();
	//closegraph();
}

char input();
double add(double, double, char);
double angle_conv(double);
void basecng(double, double);
/************************************************************/
/*					       		    */
/*   THIS FUNCTION DRAWS THE BUTTONS OF THE CALCULATER      */
/*                                                          */
/************************************************************/
void button_3d(int x1, int y1, int x2, int y2, int check, char* text, int color)
{
	int up, low;
	setfillstyle(1, 7);
	bar(x1, y1, x2, y2);
	if (check == 0)    //Unclicked
		up = 15, low = 8;
	else
		up = 8, low = 15;     //Clicked
	setcolor(low);
	line(x2, y1, x2, y2);
	line(x2 - 1, y1, x2 - 1, y2);
	line(x1, y2, x2, y2);
	line(x1 + 1, y2 - 1, x2, y2 - 1);

	setcolor(up);
	line(x1, y1, x2, y1);
	line(x1 + 1, y1 + 1, x2 - 1, y1 + 1);
	line(x1, y1, x1, y2);
	line(x1 + 1, y1 + 1, x1 + 1, y2 - 1);
	setcolor(color);

	settextjustify(CENTER_TEXT, CENTER_TEXT);
	outtextxy(x1 + (x2 - x1) / 2, (y1 + (y2 - y1) / 2) - 2, text);

}
/*********************************************************************/
/*                                                                   */
/*               This function makes the opening screen              */
/*                                                                   */
/*********************************************************************/

void frontpage(void)
{
	int mx, my;

	mx = (getmaxx() / 2);
	my = (getmaxy() / 2);

	//SET baqckground color
	setfillstyle(9, 1);
	bar(0, 0, getmaxx(), getmaxy());

	//DRAW a bar, and make it look like a 3d bar
	setfillstyle(1, 7);
	bar(50, 20, 600, 400);

	//DRAW lines for the top and left side
	setcolor(15);
	line(50, 20, 600, 20);
	line(51, 21, 599, 21);
	line(50, 20, 50, 400);
	line(51, 21, 51, 399);

	//DRAW lines for the bottom and right side
	setcolor(8);
	line(600, 20, 600, 400);
	line(599, 21, 599, 400);
	line(50, 400, 600, 400);
	line(51, 399, 600, 399);

	//DRAW two 3D bars for the left and right side

	setfillstyle(9, 8);
	bar(70, 40, 100, 380);
	//getch();
	bar(545, 40, 575, 380);
	setcolor(8);
	rectangle(70, 40, 100, 380);
	rectangle(545, 40, 575, 380);
	setcolor(15);
	line(100, 40, 100, 380);
	line(70, 380, 100, 380);
	line(575, 40, 575, 380);
	line(545, 380, 575, 380);

	//DRAW two 3D divider lines on both sides
	setcolor(8);
	line(110, 40, 110, 380);
	line(535, 40, 535, 380);
	setcolor(15);
	line(111, 40, 111, 380);
	line(536, 40, 536, 380);

	//PRINT 3D text CALENDAR 2002
	settextstyle(1, 0, 4);
	settextjustify(1, 1);
	setcolor(15);
	outtextxy(mx + 2, my - 46, "MY CALCULATER");
	setcolor(7);
	outtextxy(mx + 1, my - 45, "MY CALCULATER");
	setcolor(8);
	outtextxy(mx + 2, my - 44, "MY CALCULATER");

	//PRINT 3D text 2002
	setcolor(15);
	outtextxy(mx, my + 10, "2002");
	setcolor(7);
	outtextxy(mx + 1, my + 11, "2002");
	setcolor(8);
	outtextxy(mx + 2, my + 12, "2002");

	//PRINT copyright notice
	settextstyle(2, 0, 5);
	setcolor(1);
	outtextxy(mx + 1, my + 85, "Copyright 2002 by ASAS Creations");

	getch(); //PAUSE for a while
}

/*********************************************************************/
/*                                                                   */
/*               This function makes the claculating screen          */
/*                                                                   */
/*********************************************************************/

void screen(int x1, int y1, int x2, int y2)
{
	setlinestyle(0, 0, 1);
	setfillstyle(SOLID_FILL, 8);
	bar(x1, y1, x2, y2);
	setfillstyle(SOLID_FILL, BLACK);
	bar(x1 + 1, y1 + 1, x2 - 1, y2 - 1);



	settextjustify(CENTER_TEXT, CENTER_TEXT);
	setcolor(15);
	line(x1 + 1, y1 + 1, x1 + 1, y2 - 1);
	line(x1 + 1, y1 + 1, x2 - 1, y1 + 1);
	line(x1 + 2, y1 + 2, x1 + 2, y2 - 2);
	line(x1 + 2, y1 + 2, x2 - 2, y1 + 2);
	setcolor(8);
	line(x1 + 1, y2 - 1, x2 - 1, y2 - 1);
	line(x2 - 1, y1 + 1, x2 - 1, y2 - 1);
	line(x1 + 2, y2 - 2, x2 - 2, y2 - 2);
	line(x2 - 2, y1 + 2, x2 - 2, y2 - 2);

}


/************************************************************************/
/*                                                                      */
/*              	     Mouse Related Functions                     */
/*                                                                      */
/************************************************************************/

void init_mouse()
{
	union REGS iregs, oregs;

	iregs.x.ax = 0;
	int86(0x33, &iregs, &oregs);

	if (oregs.x.ax == 0)
	{
		cleardevice();
		printf("mouse not installed\n");
		getch();
		exit(1);
	}
	iregs.x.ax = 1;
	int86(0x33, &iregs, &oregs);
}
/*************************************************************/

void mouse()
{
	int button, x1, y1;
	union REGS iregs, oregs;

	iregs.x.ax = 3;
	int86(0x33, &iregs, &oregs);

	button = oregs.x.bx & 3;
	x1 = oregs.x.cx;
	y1 = oregs.x.dx;

	if (oregs.x.bx & 1)
	{
		X = x1; Y = y1;
	}

	if (button == 3)
		exit(0);
}



/*************************************************************/

void hide_mouse()
{
	union REGS ioRegs;
	ioRegs.x.ax = 2;
	int86(0x33, &ioRegs, &ioRegs);
}



/*************************************************************/
void show_mouse()
{
	union REGS ioRegs;
	ioRegs.x.ax = 1;
	int86(0x33, &ioRegs, &ioRegs);
}

/*************************************************************/
void remove_mouse()
{
	union REGS ioRegs;
	ioRegs.x.ax = 0;
	int86(0x33, &ioRegs, &ioRegs);
}


/*************************************************************************/
/*                                                                       */
/*	THIS FUNCTION DRAWS THE CALCULATER ON THE SCREEN                 */
/*                                                                       */
/*************************************************************************/
void	structure()
{
	init_mouse();
	setbkcolor(0);
	cleardevice();
	hide_mouse();
	//**********************************************************
	 //   Buttons Making

	front();
	frontpage();
	settextstyle(2, 0, 4);
	button_3d(50, 20, 600, 400, UNCLICKED, "", 1);     // main box
	screen(100, 50, 545, 120);	  // screen


	setfillstyle(1, 8);
	bar(52, 22, 598, 42);
	button_3d(575, 23, 595, 40, UNCLICKED, "x", 0);
	setcolor(0);
	outtextxy(120, 30, "Calculater v1.0");
	button_3d(108, 140, 208, 160, UNCLICKED, "DEC", 15); // box of decimal
	button_3d(218, 140, 318, 160, UNCLICKED, "OCT", 0); // box of octal
	button_3d(328, 140, 428, 160, UNCLICKED, "HEX", 0); // box of hexal
	button_3d(438, 140, 538, 160, UNCLICKED, "BIN", 0); // box of binary

	button_3d(350, 205, 380, 225, UNCLICKED, "7", 0);  // Box Of 7
	button_3d(390, 205, 420, 225, UNCLICKED, "8", 0);  // Box Of 8
	button_3d(430, 205, 460, 225, UNCLICKED, "9", 0);  // Box Of 9

	button_3d(350, 230, 380, 250, UNCLICKED, "4", 0);   // Box Of 4
	button_3d(390, 230, 420, 250, UNCLICKED, "5", 0);   // Box Of 5
	button_3d(430, 230, 460, 250, UNCLICKED, "6", 0);   // Box Of 6

	button_3d(480, 230, 510, 250, UNCLICKED, "*", 0);   // Box Of *
	button_3d(515, 230, 545, 250, UNCLICKED, "/", 0);   // Box Of \
		button_3d(480,205,510,225,UNCLICKED,"AC",4);	//Box Of AllClear (AC)
	button_3d(515, 205, 545, 225, UNCLICKED, "CE", 4);	//Box Of Clear (C)

	button_3d(350, 255, 380, 275, UNCLICKED, "1", 0);   // Box Of 1
	button_3d(390, 255, 420, 275, UNCLICKED, "2", 0);   // Box Of 2
	button_3d(430, 255, 460, 275, UNCLICKED, "3", 0);   // Box Of 3

	button_3d(350, 280, 380, 300, UNCLICKED, "0", 0);   // Box Of Zero (0)
	button_3d(390, 280, 420, 300, UNCLICKED, ".", 0);   // Box Of Period (.)
	button_3d(430, 280, 460, 300, UNCLICKED, "pi", 0); // Box Of PhiFunction

	button_3d(480, 255, 510, 275, UNCLICKED, "-", 0);   //  Box Of -
	button_3d(515, 255, 545, 275, UNCLICKED, "+", 0);   //  Box Of +
	button_3d(350, 305, 460, 325, UNCLICKED, "=", 0);   // Box Of Equality
	button_3d(480, 305, 545, 325, UNCLICKED, "shift", BLUE);   // Box Of shift

	button_3d(480, 280, 510, 300, UNCLICKED, "sqrt", 0);     //Box of x^n
	button_3d(515, 280, 545, 300, UNCLICKED, "inv", 0);      //box of 1/x

	button_3d(100, 205, 150, 230, UNCLICKED, "Sin", 0);	  // Box OfSin Function
	button_3d(160, 205, 210, 230, UNCLICKED, "Cos", 0);     // Box Of CosFunction
	button_3d(220, 205, 270, 230, UNCLICKED, "Tan", 0);	  // Box Of Tan Function


	button_3d(100, 250, 150, 275, UNCLICKED, "sin^-1", 0);    // Box Of sin^-1
	button_3d(160, 250, 210, 275, UNCLICKED, "cos^-1", 0);    // Box Of cos^-1
	button_3d(220, 250, 270, 275, UNCLICKED, "tan^-1", 0);    // Box Of tan^-1

	button_3d(100, 300, 150, 325, UNCLICKED, "ln", 0);    // Box Of ln
	settextjustify(CENTER_TEXT, CENTER_TEXT);
	setcolor(BLUE);
	settextstyle(2, 0, 4);
	outtextxy(125, 290, "e");
	outtextxy(185, 290, "10^x");
	outtextxy(245, 290, "x^3");
	button_3d(160, 300, 210, 325, UNCLICKED, "log", 0);    // Box Of log
	button_3d(220, 300, 270, 325, UNCLICKED, "x^2", 0);    // Box Of x^2

	button_3d(100, 350, 150, 370, UNCLICKED, "deg", 15);
	button_3d(160, 350, 210, 370, UNCLICKED, "rad", 0);
	button_3d(220, 350, 270, 370, UNCLICKED, "gra", 0);
	button_3d(480, 350, 545, 370, UNCLICKED, "Off", 4);


	button_3d(350, 350, 380, 370, UNCLICKED, "M+", 0);
	button_3d(390, 350, 420, 370, UNCLICKED, "M-", 0);
	button_3d(430, 350, 460, 370, UNCLICKED, "MR", 0);






















}
/*********************************************************/
/*                                                       */
/*			Main starts			 */
/*                                                       */
/*********************************************************/
void main()
{
	clrscr();

	double y = 0, z = 0, pnt, pnt1 = 0, x = 0, r = 0;

	int gdriver = DETECT, gmode, errorcode;
	int i;
	initgraph(&gdriver, &gmode, "f:\\tc\\bgi");
	midx = getmaxx() / 2; midy = getmaxy() / 2;
	structure();
	gotoxy(row, col);
	printf("\t\t\t\t\t");
	gotoxy(row, col);
	printf("0");
	mem = (float*)malloc(y * sizeof(float));
	while (ch != 27 && ch1 != 27)   //While Escape is not pressed
	{                                      //and if base is not 10
		pnt1 = 0;//no doubleing point entered Yet
		ch2 = '0';
		//  for(int a=0;ch!=27;a++)//a indicates whether a no. has been entered or not
		while (ch2 != 27)
			//a=0 means that no no. has been entered yet
		{
			if (bflagp != 'u')
			{
				//gotoxy(row,col);
				dummy = input();
				if (dummy != 'o')
				{
					gotoxy(row, col);
					printf("The trail version does not support this feature");
					input();
					gotoxy(row, col);
					printf("\t\t\t\t\t\t");
					// ch='0';
				}
				y = 0; z = 0; ch = '0';
				gotoxy(row, col);
				printf("\t\t\t\t\t\t");
				gotoxy(row, col);
				printf("0");

				// bflagp='u';
			}


			ch = input();
			if (ch == '>' || ch == '<' || ch == '?')
			{
				sflag = 0;
				if (ch == '>')   //M+
					*mem += y;
				if (ch == '<')   //M-
					*mem -= y;
				if (ch == '?')    //MR
				{
					y = *mem;
					gotoxy(row, col);
					printf("\t\t\t\t\t\t");
					gotoxy(row, col);
					printf("%g", y);
				}
				if (*mem == 0)
					mflag = 0;
				if (*mem != 0)
					mflag = 1;
			}
			if (mflag == 0)
			{
				gotoxy(row, 7);

				printf(" ");

			}
			if (mflag != 0)
			{
				gotoxy(row, 7);

				printf("M");
			}
			gotoxy(row, col);

			if (ch == 'a')
			{
				sflag = 0;
				y = 0;
				gotoxy(row, col);
				printf("\t\t\t\t\t");
				gotoxy(row, col);
				printf("0");
			}

			if (ch == 'o')
				//for clearing the screen of the calculater
			{
				sflag = 0;
				y = 0; z = 0;
				gotoxy(row, col);
				printf("\t\t\t\t    ");
				gotoxy(row, col);
				printf("0");
				gotoxy(row, col);
				break;
			}

			if (ch == 'q')
			{
				sflag = 0;
				y = sqrt(y);
				gotoxy(row, col);
				printf("\t\t\t\t    ");
				gotoxy(row, col);
				printf("%g", y);
			}
			if (ch == 'm')
			{
				sflag = 0;
				y = 1 / y;
				gotoxy(row, col);
				printf("\t\t\t\t    ");
				gotoxy(row, col);
				printf("%g", y);
			}
			if (ch == '+' || ch == '-' || ch == '/' || ch == '\\' || ch == '=' || ch == '*')
			{
				sflag = 0;
				break;
			}
			if (ch == '.') //case for a decimal point
			{
				sflag = 0;
				if (pnt1 == 0) //ie no decimal has been entered yet
				{
					gotoxy(row, col);
					printf("\t\t\t\t    ");//         double
					gotoxy(row, col);
					printf("%g.", y);
					pnt1 = .1;   //ie one decimal point no has been entered
					continue;  //go back to the begining and get the next number
				}
				else     //decimal point has alredy been entered and thus no change in the screen
				{
					sflag = 0;
					continue; //go back to the begining
				}
			}//out of the '.' condition

			if (pnt1 != 0)  //ie we have a doubleing point
			{
				sflag = 0;
				if (ch <= '9' && ch >= '0') //input integer
				{
					//   printf("%c",ch);
					x = (double)ch;//type cast the character into double to perforn further operations
					x -= 48;      //since character digit indoubleing -48 gives the corresponding ASCII
					x = x * pnt1;   //make it a decimal
					y = x + y;      //add it in result
					pnt1 *= .1;   //shift to the second doubleing point
					gotoxy(row, col);
					printf("%g", y);
					gotoxy(row, col);
					continue;   //back to the top
				}
			}
			//if no decimal point number then proceed

			if (ch <= '9' && ch >= '0')
			{
				sflag = 0;
				x = (double)ch;     //typecast to double
				x -= 48;           //get corresponding ASCII
				y = (y * 10) + x;      //add to right of result
				gotoxy(row, col);  //go back to start of the calc screen
				printf("\t\t\t\t    ");  //clear the screen
				gotoxy(row, col);
				printf("%g", y);  //print the number
			}
			if (ch == 'u' || ch == 'v' || ch == 'w' || ch == 'x')
			{
				sflag = 0;
				if (bflagp == bflag && bflag == 'u')
					continue;
				else
					basecng(y, pnt1);
			}
			if (ch == 'd' || ch == 'r' || ch == 'g')
			{
				sflag = 0;
				y = angle_conv(y);
				gotoxy(row, col);
				printf("\t\t\t\t    ");
				gotoxy(row, col);
				printf("%g", y);
				//  gotoxy(row,col);
			   //   printf("%g",y);
				//  continue;
			}
			if (ch == 's' || ch == 'c' || ch == 't' || ch == 'i' || ch == 'j' || ch == 'k' || ch == 'n' || ch == 'l' || ch == 'p' || ch == 'h')
				//ie the user opted for a function
			{
				if (ch == 's' || ch == 'c' || ch == 't')  //sin  /cos/tan
				{
					sflag = 0;
					if (flag != 'r')
					{
						flagp = flag;
						flag = 'r';
						y = angle_conv(y);
						flag = flagp;
					}
					//  gotoxy(row,col);
					//  printf("%g",y);getch();
					switch (ch)
					{

					case 's':	y = sin(y);  break;
					case 'c':   y = cos(y);  break;
					case 't':  	y = tan(y);  break;
					}
				}
				if (ch == 'i' || ch == 'j' || ch == 'k')
				{
					sflag = 0;
					if (flag != 'r')
					{
						// flagp=flag;
						flagp = 'r';
						//y=angle_conv(y);
					}
					switch (ch)
					{
					case 'i':   y = asin(y);  break;
					case 'j':	y = acos(y);  break;
					case 'k':	y = atan(y);  break;
					}
					if (flag != 'r')
						y = angle_conv(y);
				}
				else if (ch == 'n')
				{
					if (sflag == 1)
					{
						y = exp(y);
						sflag = 0;
					}
					else
						y = log(y);     //ln
				}
				else if (ch == 'l')
				{
					if (sflag == 1)
					{
						y = pow(10, y);
						sflag = 0;
					}
					else
						y = log10(y);    //log
				}
				else if (ch == 'p')
				{
					if (sflag == 1)
					{
						y = pow(y, 3);
						sflag = 0;
					}
					else
						y = pow(y, 2);    //square
				}
				else if (ch == 'h')
				{
					sflag = 0;
					y = PI;          //pi
				}

				gotoxy(row, col);
				printf("\t\t\t\t    ");//Clear the screen
				gotoxy(row, col);
				printf("%g", y);
			}//else condition

		}//out of second condition  ie we now have the first no. or function or operater

		for (; ch != 27 && ch1 != '=' && ch != '=';)//ie the characters input are not ESCAPE or Equal to

		{
			pnt1 = 0; z = 0;
			if (ch == 'o' || ch1 == 'o')     // For Clear The Screen
			{

				sflag = 0;
				y = 0; z = 0;
				gotoxy(row, col);
				printf("\t\t\t\t    ");
				//	gotoxy(col,row);
				gotoxy(row, col);
				printf("0");
				gotoxy(row, col);
				break;
			}
			for (; ch1 != 27;)
			{
				gotoxy(row, col);
				// 	printf("%g",z);
				 //	z=0;
				ch1 = input();

				if (ch1 == '>' || ch1 == '<' || ch1 == '?')
				{
					if (ch1 == '>')   //M+
						*mem += z;
					if (ch1 == '<')   //M-
						*mem -= z;
					if (ch1 == '?')    //MR
					{
						z = *mem;
						gotoxy(row, col);
						printf("\t\t\t\t    ");
						gotoxy(row, col);
						printf("%g", z);
					}
					if (*mem == 0)
						mflag = 0;
					if (*mem != 0)
						mflag = 1;
				}
				if (mflag == 0)
				{
					gotoxy(row, 7);
					printf(" ");
				}
				if (mflag != 0)
				{
					gotoxy(row, 7);
					printf("M");
				}
				gotoxy(row, col);


				if (ch1 == 'a')
				{
					z = 0;
					gotoxy(row, col);
					printf("\t\t\t\t  ");
					gotoxy(row, col);
					printf("0");
				}

				if (ch == 'o' || ch1 == 'o')     // For Clear The Screen
				{
					y = 0; z = 0;
					gotoxy(row, col);
					//cout<<"                ";
					printf("\t\t\t\t    ");
					gotoxy(row, col);
					printf("0");
					gotoxy(row, col);
					break;
				}
				if (ch1 == 'q')
				{
					z = sqrt(z);
					gotoxy(row, col);
					printf("\t\t\t\t    ");
					gotoxy(row, col);
					printf("%g", z);
				}
				if (ch1 == 'm')
				{
					z = 1 / z;
					gotoxy(row, col);
					printf("\t\t\t\t    ");
					gotoxy(row, col);
					printf("%g", z);
				}

				if (ch1 == '.')
				{
					if (pnt1 == 0)
					{
						gotoxy(row, col);
						printf("\t\t\t\t    ");
						gotoxy(row, col);
						//cout<<z<<".";
						printf("%g.", z);
						pnt1 = .1;
						continue;
					}
					else
					{
						continue;
					}
				}
				if (pnt1 != 0)
				{
					if (ch1 <= '9' && ch1 >= '0')
					{
						//	printf("%c",ch1);
						x = (double)ch1;
						x -= 48;
						x = x * pnt1;
						z = x + z;
						pnt1 = pnt1 * .1;
						gotoxy(row, col);
						printf("\t\t\t\t    ");
						gotoxy(row, col);
						printf("%g", z);
						continue;
					}
				}

				if (ch1 == '+' || ch1 == '-' || ch1 == '*' || ch1 == '/' || ch1 == '=')
					break;
				if (ch1 >= '0' && ch1 <= '9')
				{
					x = (double)ch1;
					x = x - 48;
					gotoxy(row, col);
					printf("\t\t\t\t    ");
					gotoxy(row, col);
					z = (z * 10) + x;
					printf("%g", z);
				}
				if (ch == 'u')
					if (ch == 'd' || ch == 'r' || ch == 'g')
					{
						z = angle_conv(z);
						gotoxy(row, col);
						printf("\t\t\t\t    ");
						gotoxy(row, col);
						printf("%g", z);
						// continue;
					}
				if (ch1 == 's' || ch1 == 'c' || ch1 == 't' || ch1 == 'i' || ch1 == 'j' || ch1 == 'k' || ch1 == 'n' || ch1 == 'l' || ch1 == 'p' || ch1 == 'h')
					//ie the user opted for a function
				{
					if (ch1 == 's' || ch1 == 'c' || ch1 == 't')  //sin
					{
						if (flag != 'r')
						{
							flagp = flag;
							flag = 'r';
							angle_conv(z);
							flag = flagp;
						}
						switch (ch1)
						{
						case 's':   z = sin(z);  break;
						case 'c':	z = cos(z);  break;
						case 't':	z = tan(z);  break;
						}
					}
					if (ch1 == 'i' || ch1 == 'j' || ch1 == 'k')
					{
						if (flag != 'r')
						{
							flagp = 'r';
						}
						switch (ch1)
						{
						case 'i':   z = asin(z);  break;
						case 'j':	z = acos(z);  break;
						case 'k':	z = atan(z);  break;
						}
						z = angle_conv(z);
					}
					else if (ch1 == 'l')
					{
						z = log10(z);    //log
					}
					else if (ch1 == 'p')
					{
						z = pow(z, 2);    //square
					}
					else if (ch1 == 'h')
					{
						z = PI;          //pi
					}

					gotoxy(row, col);
					printf("\t\t\t\t    ");
					gotoxy(row, col);
					printf("%g", z);
					gotoxy(row, col);
				}
			}

			if (ch1 == '+' || ch1 == '-' || ch1 == '=')
			{
				y = add(y, z, ch);
				if (ch2 != '0')
				{
					y = add(r, y, ch2);
					ch2 = '0';
				}
			}
			else
			{
				if (ch == '*' || ch == '/')
					y = add(y, z, ch);
				else
				{
					ch2 = ch;
					r = y;
					y = z;
				}
			}
			gotoxy(row, col);
			printf("\t\t\t\t    ");
			gotoxy(row, col);
			printf("%g", y);
			ch = ch1;
			ch1 = '0';
			if (ch == '=' || ch1 == '=')
				break;
		}
		if (ch == 'o' || ch1 == 'o')     // For Clear The Screen
		{
			y = 0; z = 0;
			gotoxy(row, col);
			printf("\t\t\t\t    ");
			gotoxy(row, col);
			printf("0");
			gotoxy(row, col);
			continue;
		}
		gotoxy(row, col);
		printf("\t\t\t\t    ");
		gotoxy(row, col);
		printf("%g", y);
		z = 0;
	}

	//	getch();
	closegraph();
	remove_mouse();
	exit(0);

}





/*************************************************************/
/*							     */
/*          This function gets the user's Input		     */
/*							     */
/*************************************************************/

char input()
{
	X = 0; Y = 0;
	char ch;
	show_mouse();
	if (bflag != 'u')
	{
		button_3d(108, 140, 208, 160, UNCLICKED, "DEC", 15);
		button_3d(218, 140, 318, 160, UNCLICKED, "OCT", 0);
		button_3d(328, 140, 428, 160, UNCLICKED, "HEX", 0);
		button_3d(438, 140, 538, 160, UNCLICKED, "BIN", 0);
		bflag = 'u';
	}
	do
	{
		mouse();
		if (X >= 350 && X <= 380 && Y >= 205 && Y <= 225) // Condition For 7
		{
			hide_mouse();
			button_3d(350, 205, 380, 225, CLICKED, "7", 0);
			show_mouse();
			delay(250);
			hide_mouse();
			button_3d(350, 205, 380, 225, UNCLICKED, "7", 0);
			show_mouse();
			ch = '7';
			return ch;
		}


		//**********************************************

		if (X >= 390 && X <= 420 && Y >= 205 && Y <= 225) // Condition For 8
		{

			hide_mouse();
			button_3d(390, 205, 420, 225, CLICKED, "8", 0);
			show_mouse();
			delay(250);
			hide_mouse();
			button_3d(390, 205, 420, 225, UNCLICKED, "8", 0);
			show_mouse();
			ch = '8';
			return ch;
		}


		//*****************************************

		if (X >= 430 && X <= 460 && Y >= 205 && Y <= 225) // Condition For 9
		{
			hide_mouse();
			button_3d(430, 205, 460, 225, CLICKED, "9", 0);
			show_mouse();
			delay(250);
			hide_mouse();
			button_3d(430, 205, 460, 225, UNCLICKED, "9", 0);
			show_mouse();
			ch = '9';
			return ch;
		}


		//***********************************

		if (X >= 350 && X <= 380 && Y >= 230 && Y <= 250) // Condition For 4
		{
			hide_mouse();
			button_3d(350, 230, 380, 250, CLICKED, "4", 0);
			show_mouse();
			delay(250);
			hide_mouse();
			button_3d(350, 230, 380, 250, UNCLICKED, "4", 0);
			show_mouse();
			ch = '4';
			return ch;
		}


		//***********************************

		if (X >= 390 && X <= 420 && Y >= 230 && Y <= 250) // Condition For 5
		{
			hide_mouse();
			button_3d(390, 230, 420, 250, CLICKED, "5", 0);
			show_mouse();
			delay(250);
			hide_mouse();
			button_3d(390, 230, 420, 250, UNCLICKED, "5", 0);
			show_mouse();
			ch = '5';
			return ch;
		}


		//***********************************

		if (X >= 430 && X <= 460 && Y >= 230 && Y <= 250) // Condition For 6
		{
			hide_mouse();
			button_3d(430, 230, 460, 250, CLICKED, "6", 0);
			show_mouse();
			delay(250);
			hide_mouse();
			button_3d(430, 230, 460, 250, UNCLICKED, "6", 0);
			show_mouse();
			ch = '6';
			return ch;
		}


		//***********************************

		if (X >= 480 && X <= 510 && Y >= 230 && Y <= 250) // Condition For *
		{
			hide_mouse();
			button_3d(480, 230, 510, 250, CLICKED, "*", 0);
			show_mouse();
			delay(250);
			hide_mouse();
			button_3d(480, 230, 510, 250, UNCLICKED, "*", 0);
			show_mouse();
			ch = '*';
			return ch;
		}
		//***********************************

		if (X >= 515 && X <= 545 && Y >= 230 && Y <= 250) // Condition For /
		{
			hide_mouse();
			button_3d(515, 230, 545, 250, CLICKED, "/", 0);
			show_mouse();
			delay(250);
			hide_mouse();
			button_3d(515, 230, 545, 250, UNCLICKED, "/", 0);
			show_mouse();
			ch = '/';
			return ch;
		}

		//***********************************
		int  a, b;
		if (X >= 350 && X <= 380 && Y >= 255 && Y <= 275) // Condition For 1
		{
			hide_mouse();
			button_3d(350, 255, 380, 275, CLICKED, "1", 0);
			show_mouse();
			delay(250);
			hide_mouse();
			button_3d(350, 255, 380, 275, UNCLICKED, "1", 0);
			show_mouse();
			ch = '1';
			return ch;
		}

		// *************************************

		if (X >= 390 && X <= 420 && Y >= 255 && Y <= 275) // Condition For 2
		{
			hide_mouse();
			button_3d(390, 255, 420, 275, CLICKED, "2", 0);
			show_mouse();
			delay(250);
			hide_mouse();
			button_3d(390, 255, 420, 275, UNCLICKED, "2", 0);
			show_mouse();
			ch = '2';
			return ch;
		}

		// *************************************

		if (X >= 430 && X <= 460 && Y >= 255 && Y <= 275) // Condition For 3
		{
			hide_mouse();
			button_3d(430, 255, 460, 275, CLICKED, "3", 0);
			show_mouse();
			delay(250);
			hide_mouse();
			button_3d(430, 255, 460, 275, UNCLICKED, "3", 0);
			show_mouse();
			ch = '3';
			return ch;
		}

		// *************************************

		if (X >= 350 && X <= 380 && Y >= 280 && Y <= 300) // Condition For 0
		{
			hide_mouse();
			button_3d(350, 280, 380, 300, CLICKED, "0", 0);
			show_mouse();
			delay(250);
			hide_mouse();
			button_3d(350, 280, 380, 300, UNCLICKED, "0", 0);
			show_mouse();
			ch = '0';
			return ch;
		}

		// *************************************

		if (X >= 390 && X <= 420 && Y >= 280 && Y <= 300) // Condition For .
		{
			hide_mouse();
			button_3d(390, 280, 420, 300, CLICKED, ".", 0);
			show_mouse();
			delay(250);
			hide_mouse();
			button_3d(390, 280, 420, 300, UNCLICKED, ".", 0);
			show_mouse();
			ch = '.';
			return ch;
		}

		//**********************************************

		if (X >= 430 && X <= 460 && Y >= 280 && Y <= 300) // Condition For pi
		{
			hide_mouse();
			button_3d(430, 280, 460, 300, CLICKED, "pi", 0);
			show_mouse();
			delay(250);
			hide_mouse();
			button_3d(430, 280, 460, 300, UNCLICKED, "pi", 0);
			show_mouse();
			ch = 'h';
			return ch;
		}

		//***********************************************

		if (X >= 480 && X <= 510 && Y >= 255 && Y <= 275) // Condition For -
		{
			hide_mouse();
			button_3d(480, 255, 510, 275, CLICKED, "-", 0);
			show_mouse();
			delay(250);
			hide_mouse();
			button_3d(480, 255, 510, 275, UNCLICKED, "-", 0);
			show_mouse();
			ch = '-';
			return ch;
		}

		//**************************************************

		if (X >= 515 && X <= 545 && Y >= 255 && Y <= 275) // Condition For +
		{
			hide_mouse();
			button_3d(515, 255, 545, 275, CLICKED, "+", 0);
			show_mouse();
			delay(250);
			hide_mouse();
			button_3d(515, 255, 545, 275, UNCLICKED, "+", 0);
			show_mouse();
			ch = '+';
			return ch;
		}

		//*****************************************************

		if (X >= 350 && X <= 460 && Y >= 305 && Y <= 325) // Condition For =
		{
			hide_mouse();
			button_3d(350, 305, 460, 325, CLICKED, "=", 0);
			show_mouse();
			delay(250);
			hide_mouse();
			button_3d(350, 305, 460, 325, UNCLICKED, "=", 0);
			show_mouse();
			ch = '=';
			return ch;
		}

		//*****************************************************

		if (X >= 480 && X <= 545 && Y >= 305 && Y <= 325) // Condition For shift
		{
			hide_mouse();
			button_3d(480, 305, 545, 325, CLICKED, "shift", BLUE);
			show_mouse();
			delay(250);
			hide_mouse();
			button_3d(480, 305, 545, 325, UNCLICKED, "shift", BLUE);
			show_mouse();
			ch = '~';
			sflag = 1;
			return ch;
		}


		//*************************************

		if (X >= 480 && X <= 510 && Y >= 205 && Y <= 225) // Condition For AC
		{
			hide_mouse();
			button_3d(480, 205, 510, 225, CLICKED, "AC", 4);
			show_mouse();
			delay(250);
			hide_mouse();
			button_3d(480, 205, 510, 225, UNCLICKED, "AC", 4);
			show_mouse();
			ch = 'o';
			return ch;
		}
		/********************C*/
		if (X >= 515 && X <= 545 && Y >= 205 && Y <= 225) // Condition For C
		{
			hide_mouse();
			button_3d(515, 205, 545, 225, CLICKED, "CE", 4);
			show_mouse();
			delay(250);
			hide_mouse();
			button_3d(515, 205, 545, 225, UNCLICKED, "CE", 4);
			show_mouse();
			ch = 'a';
			return ch;
		}

		// ****************************************

		if (X >= 100 && X <= 150 && Y >= 205 && Y <= 230) // Condition For Sin
		{
			hide_mouse();
			button_3d(100, 205, 150, 230, CLICKED, "Sin", 0);
			show_mouse();
			delay(250);
			hide_mouse();
			button_3d(100, 205, 150, 230, UNCLICKED, "Sin", 0);
			show_mouse();
			ch = 's';
			return ch;
		}

		//***********************************

		if (X >= 160 && X <= 210 && Y >= 205 && Y <= 230) // Condition For Cos
		{
			hide_mouse();
			button_3d(160, 205, 210, 230, CLICKED, "Cos", 0);
			show_mouse();
			delay(250);
			hide_mouse();
			button_3d(160, 205, 210, 230, UNCLICKED, "Cos", 0);
			show_mouse();
			ch = 'c';
			return ch;
		}

		//***********************************

		if (X >= 515 && X <= 545 && Y >= 280 && Y <= 300)     //inverse
		{
			hide_mouse();
			button_3d(515, 280, 545, 300, CLICKED, "inv", 0);
			show_mouse();
			delay(250);
			hide_mouse();
			button_3d(515, 280, 545, 300, UNCLICKED, "inv", 0);
			show_mouse();
			ch = 'm';
			return ch;
		}


		if (X >= 220 && X <= 270 && Y >= 205 && Y <= 230) // Condition For Tan
		{
			hide_mouse();
			button_3d(220, 205, 270, 230, CLICKED, "Tan", 0);
			show_mouse();
			delay(250);
			hide_mouse();
			button_3d(220, 205, 270, 230, UNCLICKED, "Tan", 0);
			show_mouse();
			ch = 't';
			return ch;
		}

		//***********************************  */


		if (X >= 100 && X <= 150 && Y >= 250 && Y <= 275) // Condition For sin^-1
		{
			hide_mouse();
			button_3d(100, 250, 150, 275, CLICKED, "sin^-1", 0);
			show_mouse();
			delay(150);
			hide_mouse();
			button_3d(100, 250, 150, 275, UNCLICKED, "sin^-1", 0);
			show_mouse();
			ch = 'i';
			return ch;
		}
		//**************************

		if (X >= 160 && X <= 210 && Y >= 250 && Y <= 275) // Condition For cos^-1
		{
			hide_mouse();
			button_3d(160, 250, 210, 275, CLICKED, "cos^-1", 0);
			show_mouse();
			delay(250);
			hide_mouse();
			button_3d(160, 250, 210, 275, UNCLICKED, "cos^-1", 0);
			show_mouse();
			ch = 'j';
			return ch;
		}
		//**************************

		if (X >= 430 && X <= 460 && Y >= 350 && Y <= 370) // Condition For MR
		{
			hide_mouse();
			button_3d(430, 350, 460, 370, CLICKED, "MR", 0);
			show_mouse();
			delay(250);
			hide_mouse();
			button_3d(430, 350, 460, 370, UNCLICKED, "MR", 0);
			show_mouse();
			ch = '?';
			return ch;
		}
		if (X >= 390 && X <= 420 && Y >= 350 && Y <= 370) // Condition For M-
		{
			hide_mouse();
			button_3d(390, 350, 420, 370, CLICKED, "M-", 0);
			show_mouse();
			delay(250);
			hide_mouse();
			button_3d(390, 350, 420, 370, UNCLICKED, "M-", 0);
			show_mouse();
			ch = '<';
			return ch;
		}
		if (X >= 350 && X <= 380 && Y >= 350 && Y <= 370) // Condition For M+
		{
			hide_mouse();
			button_3d(350, 350, 380, 370, CLICKED, "M+", 0);
			show_mouse();
			delay(250);
			hide_mouse();
			button_3d(350, 350, 380, 370, UNCLICKED, "M+", 0);
			show_mouse();
			ch = '>';
			return ch;
		}

		if (X >= 220 && X <= 270 && Y >= 250 && Y <= 275) // Condition For tan^-1
		{
			hide_mouse();
			button_3d(220, 250, 270, 275, CLICKED, "tan^-1", 0);
			show_mouse();
			delay(250);
			hide_mouse();
			button_3d(220, 250, 270, 275, UNCLICKED, "tan^-1", 0);
			show_mouse();
			ch = 'k';
			return ch;
		}
		//**************************


		if (X >= 100 && X <= 150 && Y >= 300 && Y <= 325) // Condition For ln
		{
			hide_mouse();
			button_3d(100, 300, 150, 325, CLICKED, "ln", 0);
			show_mouse();
			delay(250);
			hide_mouse();
			button_3d(100, 300, 150, 325, UNCLICKED, "ln", 0);
			show_mouse();
			ch = 'n';
			return ch;
		}
		//**************************

		if (X >= 160 && X <= 210 && Y >= 300 && Y <= 325) // Condition For log
		{
			hide_mouse();
			button_3d(160, 300, 210, 325, CLICKED, "log", 0);
			show_mouse();
			delay(150);
			hide_mouse();
			button_3d(160, 300, 210, 325, UNCLICKED, "log", 0);
			show_mouse();
			ch = 'l';
			return ch;
		}
		//**************************

		if (X >= 220 && X <= 270 && Y >= 300 && Y <= 325) // Condition For X^2
		{
			hide_mouse();
			button_3d(220, 300, 270, 325, CLICKED, "x^2", 0);
			show_mouse();
			delay(250);
			hide_mouse();
			button_3d(220, 300, 270, 325, UNCLICKED, "x^2", 0);
			show_mouse();
			ch = 'p';
			return ch;
		}
		if (X >= 100 && X <= 150 && Y >= 350 && Y <= 370) // Condition For deg
		{
			hide_mouse();
			button_3d(100, 350, 150, 370, CLICKED, "deg", 15);
			button_3d(160, 350, 210, 370, UNCLICKED, "rad", 0);
			button_3d(220, 350, 270, 370, UNCLICKED, "gra", 0);
			show_mouse();
			delay(250);
			hide_mouse();
			button_3d(100, 350, 150, 370, UNCLICKED, "deg", 15);
			show_mouse();
			ch = 'd';
			flagp = flag;
			flag = ch;
			return ch;
		}	    //**************************
		if (X >= 160 && X <= 210 && Y >= 350 && Y <= 370) // Condition For rad
		{
			hide_mouse();
			button_3d(100, 350, 150, 370, UNCLICKED, "deg", 0);
			button_3d(160, 350, 210, 370, CLICKED, "rad", 15);
			button_3d(220, 350, 270, 370, UNCLICKED, "gra", 0);
			show_mouse();
			delay(250);
			hide_mouse();
			button_3d(160, 350, 210, 370, UNCLICKED, "rad", 15);
			show_mouse();
			ch = 'r';
			flagp = flag;
			flag = ch;

			return ch;
		}
		if (X >= 220 && X <= 270 && Y >= 350 && Y <= 370) // Condition For gra
		{
			hide_mouse();
			button_3d(100, 350, 150, 370, UNCLICKED, "deg", 0);
			button_3d(160, 350, 210, 370, UNCLICKED, "rad", 0);
			button_3d(220, 350, 270, 370, CLICKED, "gra", 15);
			show_mouse();
			delay(250);
			hide_mouse();
			button_3d(220, 350, 270, 370, UNCLICKED, "gra", 15);
			show_mouse();
			ch = 'g';
			flagp = flag;
			flag = ch;
			return ch;

		}
		if ((X >= 480 && X <= 545 && Y >= 350 && Y <= 370) || (X >= 575 && X <= 595 && Y >= 23 && Y <= 40))   //OFF
		{
			free(mem);
			exit(0);
		}
		if (X >= 108 && X <= 208 && Y >= 140 && Y <= 160) // Condition For dec
		{
			hide_mouse();
			button_3d(108, 140, 208, 160, CLICKED, "DEC", 15);
			button_3d(218, 140, 318, 160, UNCLICKED, "OCT", 0);
			button_3d(328, 140, 428, 160, UNCLICKED, "HEX", 0);
			button_3d(438, 140, 538, 160, UNCLICKED, "BIN", 0);
			show_mouse();
			delay(250);
			hide_mouse();
			button_3d(108, 140, 208, 160, UNCLICKED, "DEC", 15);
			show_mouse();
			ch = 'u';
			bflagp = bflag;
			bflag = ch;
			return ch;
		}
		if (X >= 218 && X <= 318 && Y >= 140 && Y <= 160) // Condition For oct
		{
			hide_mouse();
			button_3d(108, 140, 208, 160, UNCLICKED, "DEC", 0);
			button_3d(218, 140, 318, 160, CLICKED, "OCT", 15);
			button_3d(328, 140, 428, 160, UNCLICKED, "HEX", 0);
			button_3d(438, 140, 538, 160, UNCLICKED, "BIN", 0);
			show_mouse();
			delay(250);
			hide_mouse();
			button_3d(218, 140, 318, 160, UNCLICKED, "OCT", 15);
			show_mouse();
			ch = 'v';
			bflagp = bflag;
			bflag = ch;
			return ch;
		}
		if (X >= 328 && X <= 428 && Y >= 140 && Y <= 160) // Condition For hex
		{
			hide_mouse();
			button_3d(108, 140, 208, 160, UNCLICKED, "DEC", 0);
			button_3d(218, 140, 318, 160, UNCLICKED, "OCT", 0);
			button_3d(328, 140, 428, 160, CLICKED, "HEX", 15);
			button_3d(438, 140, 538, 160, UNCLICKED, "BIN", 0);
			show_mouse();
			delay(250);
			hide_mouse();
			button_3d(328, 140, 428, 160, UNCLICKED, "HEX", 15);
			show_mouse();
			ch = 'w';
			bflagp = bflag;
			bflag = ch;
			return ch;
		}
		if (X >= 438 && X <= 538 && Y >= 140 && Y <= 160) // Condition For dec
		{
			hide_mouse();
			button_3d(108, 140, 208, 160, UNCLICKED, "DEC", 0);
			button_3d(218, 140, 318, 160, UNCLICKED, "OCT", 0);
			button_3d(328, 140, 428, 160, UNCLICKED, "HEX", 0);
			button_3d(438, 140, 538, 160, CLICKED, "BIN", 15);
			show_mouse();
			delay(250);
			hide_mouse();
			button_3d(438, 140, 538, 160, UNCLICKED, "BIN", 15);
			show_mouse();
			ch = 'x';
			bflagp = bflag;
			bflag = ch;
			return ch;
		}
		if (X >= 480 && X <= 510 && Y >= 280 && Y <= 300)
		{
			hide_mouse();
			button_3d(480, 280, 510, 300, CLICKED, "sqrt", 0);
			show_mouse();
			delay(250);
			hide_mouse();
			button_3d(480, 280, 510, 300, UNCLICKED, "sqrt", 0);
			show_mouse();
			ch = 'q';
			return ch;
		}

	} while (kbhit() == 0);
	ch = getch();
	return ch;
}

/*************************************************************************/
/*									 */
/*		This function performs the Calculations			 */
/*									 */
/*************************************************************************/
double add(double x, double y, char ch)
{
	switch (ch)
	{
	case '+':
		y = x + y;
		break;
	case '-':
		y = x - y;
		break;
	case '*':
		y = x * y;
		break;
	case '/':
		y = x / y;
	}
	return y;
}

double  angle_conv(double no)
{
	if (flagp == 'd')
	{
		if (flag == 'r')
		{
			no = no * PI / 180;
		}
		if (flag == 'g')
		{
			no = no * 1.1111111;
		}
	}
	else if (flagp == 'r')
	{
		if (flag == 'd')
		{
			no = no * 180 / PI;
		}
		if (flag == 'g')
		{
			no = no * 180 / PI * 1.1111111;
		}
	}
	else if (flagp == 'g')
	{
		if (flag == 'r')
		{
			no = no / (180 * 1.1111111) * PI;
		}
		if (flag == 'd')
		{
			no = no / 1.1111111;
		}
	}
	return(no);
}


void basecng(double y, double pnt1)
{
	char str[17];
	if (pnt1 != 0)
	{
		gotoxy(row, col);
		printf("The trial version does not support this feature");
		getch();
		bflag = 'u';
		bflagp = '0';
		main();
	}
	if (bflagp != 'u')
	{
		gotoxy(row, col);
		printf("The trial version does not support this feature ");
		getch();
		bflagp = '0';
		bflag = 'u';
		main();
	}
	switch (bflag)
	{
	case 'v':
		itoa(y, str, 8);
		gotoxy(row, col);
		printf("\t\t\t\t    ");
		gotoxy(row, col);
		printf("%s", str);
		bflagp = '0';
		break;

	case 'w':
		itoa(y, str, 16);
		gotoxy(row, col);
		printf("\t\t\t\t    ");
		gotoxy(row, col);
		printf("%s", str);
		bflagp = '0';
		// getch();
		break;

	case 'x':
		itoa(y, str, 2);
		gotoxy(row, col);
		printf("\t\t\t\t    ");
		gotoxy(row, col);
		printf("%s", str);
		// getch();
		bflagp = '0';
		break;
	}
	bflag = 'u';
}